Reading the data¶
Lately, the .fits data was transformed into .csv and saved in database/csv_files. We are going to import a light curve sample and work with it.
[ ]:
FILE_PATH = r'C:\Users\guisa\Google Drive\01 - Iniciação Científica\02 - Datasets\csv_files\EN2_STAR_CHR_0101086161_20070516T060226_20071005T074409.csv'
[ ]:
import pandas as pd
data_sample = pd.read_csv(FILE_PATH)
display(data_sample)
| DATE | WHITEFLUX | |
|---|---|---|
| 0 | 2007-05-16 18:10:55.071642 | 112626.77 |
| 1 | 2007-05-16 18:19:27.113766 | 112605.61 |
| 2 | 2007-05-16 18:27:59.155929 | 112771.50 |
| 3 | 2007-05-16 18:36:31.198092 | 113113.60 |
| 4 | 2007-05-16 18:45:03.240256 | 112621.79 |
| ... | ... | ... |
| 23946 | 2007-10-05 19:08:02.358665 | 112438.61 |
| 23947 | 2007-10-05 19:16:34.313684 | 112406.01 |
| 23948 | 2007-10-05 19:25:06.268742 | 112496.13 |
| 23949 | 2007-10-05 19:33:38.223801 | 112344.83 |
| 23950 | 2007-10-05 19:42:10.178859 | 112318.50 |
23951 rows × 2 columns
[ ]:
import numpy as np
x = data_sample.DATE.to_numpy()
y = data_sample.WHITEFLUX.to_numpy()
Ideal Lowpass Filters¶
Um filtro bi-dimensional passa-baixa que deixa passar todas as frequências em um círculo de raio \(D_0\) a partir da origem e remove todas as frequências fora desse círculo é chamado de filtro passa-baixa ideal (ILPF) e é descrito como
\[\begin{split} H(u) = \begin{cases}
1, &\text{if } D(u) \le D_0 \\
0, &\text{if } D(u) \ge D_0
\end{cases}\end{split}\]
onde \(D_0\) é uma constante positiva, e \(D(u)\) é a distância entre um ponto \(u\) até o centro do retângulo de frequência, ou seja, é definido por
\[D(u) = (u-P/2)\]
sendo \(P\) o tamanho do vetor original preenchido (padded).
O ponto de transição entre \(H(u) = 1\) e \(H(u) = 0\) é chamado de frequência de corte
[ ]:
!pip install control
from tools import *
WARNING: You are using pip version 21.1.1; however, version 21.1.3 is available.
You should consider upgrading via the 'c:\users\guisa\appdata\local\programs\python\python38\python.exe -m pip install --upgrade pip' command.
Requirement already satisfied: control in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (0.9.0)
Requirement already satisfied: scipy in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (from control) (1.6.1)
Requirement already satisfied: matplotlib in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (from control) (3.3.4)
Requirement already satisfied: numpy in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (from control) (1.19.5)
Requirement already satisfied: pillow>=6.2.0 in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (from matplotlib->control) (8.1.0)
Requirement already satisfied: cycler>=0.10 in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (from matplotlib->control) (0.10.0)
Requirement already satisfied: kiwisolver>=1.0.1 in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (from matplotlib->control) (1.3.1)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (from matplotlib->control) (2.4.7)
Requirement already satisfied: python-dateutil>=2.1 in c:\users\guisa\appdata\local\programs\python\python38\lib\site-packages (from matplotlib->control) (2.8.1)
Requirement already satisfied: six in c:\users\guisa\appdata\roaming\python\python38\site-packages (from cycler>=0.10->matplotlib->control) (1.15.0)
[ ]:
def ideal_filter(array, fourier_transform, cutoff_freq):
n_time = len(array)
D0 = cutoff_freq * n_time
xc = n_time
for i in range(len(fourier_transform)):
if fourier_transform[i] > D0:
fourier_transform[i] = 0
y_filtered = np.real(np.fft.ifft(fourier_transform))
y_filtered += (array.mean() - y_filtered.mean())
return y_filtered
[ ]:
def ideal_filter_result(array, cutoff_freq, numExpansion):
Filter = filters.FrequencyDomainFiltering()
Filter.expand_borders(y, numExpansion)
y_expanded = Filter.getExpandedBorders
y_filtered = ideal_filter(y_expanded, np.fft.fft(y_expanded), cutoff_freq)
Filter.remove_expanded_borders(y_filtered, numExpansion)
y_filtered = Filter.getNoExpanded
return y_filtered
Choosing the best Ideal Filter parameters¶
[ ]:
cutoff_freqs = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
[ ]:
i = 0
cutoff_freq = cutoff_freqs[i]
y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
print()
i += 1
[ ]:
cutoff_freq = cutoff_freqs[i]
y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
print()
i += 1
[ ]:
cutoff_freq = cutoff_freqs[i]
y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
print()
i += 1
[ ]:
cutoff_freq = cutoff_freqs[i]
y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
print()
i += 1
[ ]:
cutoff_freq = cutoff_freqs[i]
y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
print()
i += 1
[ ]:
cutoff_freq = cutoff_freqs[i]
y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
print()
i += 1
[ ]:
cutoff_freq = cutoff_freqs[i]
y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
print()
i += 1
[ ]:
cutoff_freq = cutoff_freqs[i]
y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with and Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
print()
i += 1
[ ]:
cutoff_freq = cutoff_freqs[i]
y_filtered = ideal_filter_result(y, cutoff_freq, 70)
title = f"Ideal filter with Cutoff frequency = {cutoff_freq}"
viz.view_filter_results(x, y, x, y_filtered, title=title)
[ ]: